/* Created on 07/05/2005 */
package br.ufmg.dees.insane.ui.rich.learn.util.interfaceGrafica;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import br.ufmg.dees.insane.ui.rich.learn.util.interfaces.IntArquivo;
import br.ufmg.dees.insane.ui.rich.learn.util.matriz.Matriz;
import br.ufmg.dees.insane.ui.rich.learn.util.solucao.GaussEscalonado;
import br.ufmg.dees.insane.ui.rich.learn.util.solucao.Megauss;
import br.ufmg.dees.insane.ui.rich.learn.util.util.NotacaoCientifica;

/** Uma classe para a interface grafica dos TPs 10 a 12 
 * resolu��o de sistemas lineares pelos m�todos:
 * Gauss, Gauss Escalonado e por invers�o de A.
 *  
 * @author Camara, Luciana
 * @since 07/05/2005
 * @version 1.0 */
public class MenuPanel extends JPanel implements 
ActionListener, DocumentListener,TableModelListener
{ 
  private static final long serialVersionUID = 1L;
//componente para o titulo do trabalho 
  JLabel titulo;
  //componentes dos metodos
  private ButtonGroup group;
  private JRadioButton[] but= new JRadioButton[1];
  private String[] opMetodos;
  
  //componentes do parametro (ordem do sistema  
  private JTextField param1;  
  
  //componentes dos resultados
  private JTextArea quadroRes;
  private JScrollPane painelRolagem;  
  
  //componentes de controle
  private JButton salvaButton;
  private JButton sairButton;
  
  //variaveis para o calculo
  
  //parametros com valores iniciais pre-definidos
  private int ordem; 
  
  //parametros das matrizes
  // matriz com os coeficientes do sistema
  private Object[][]matrizA=new Object[ordem][ordem];
  // matriz com o vetor B
  private Object[][]matrizB=new Object[ordem][2];
  // matriz de resultados
  private Object[][]matrizX=new Object[ordem][2]; 
  
  // parametros dos tabelas
  private JTable tableA, tableB, tableX;
  private JScrollPane scrollPaneTabelaA,scrollPaneTabelaB,scrollPaneTabelaX;
  private MyTableModel tabelaModeloA,tabelaModeloB,tabelaModeloX;
  
  // paineis com matrizes
  private  JPanel painelMA, painelMB, painelMX, painelCentral2;
    
  // String para guardar o metodo utilizado
  private String metodoAtual;
  
  //dimensoes da janela total
  private int larguraTotal;
  
  public MenuPanel(){}
  /** Construtor do painel principal do Frame
   * @param w largura da janela escolhida
   * @param h altura da janela escolhida
   * @param opMetodos lista de metodos a ser exibida   */
  public MenuPanel(int w,int h,String[] opMetodos, int o, Object[][] K, Object[][] f ){
  	ordem=o;
  	
    this.larguraTotal=w;
    
    this.opMetodos=new String[opMetodos.length];
    for (int i=0;i<opMetodos.length;i++)this.opMetodos[i]=opMetodos[i];
    
    // inicializa as matrizes
    matrizA=K;    
    matrizB=inicializaVetor(0);
    matrizX=f;
//	 Cria painel titulo
	JPanel paineltitulo =new JPanel();	
	Border titled = BorderFactory.createEtchedBorder();	
	paineltitulo.setBorder(titled);
	titulo=new JLabel("ELEMENT EQUILIBRIUM: kd=f");
	titulo.setFont(new Font("SansSerif",Font.BOLD,14));
	paineltitulo.add(titulo);

//	 cria um panel para a lista de metodos
	group=new ButtonGroup();
	but= new JRadioButton[this.opMetodos.length];
	for (int i=0;i<this.opMetodos.length;i++){
	  but[i]=new JRadioButton(this.opMetodos[i],false);
	  but[i].addActionListener(this);
	  group.add(but[i]);
	}
	but[0].setEnabled(true);
	
	// cria o painel 
	JPanel painel1 = new JPanel();
	Border etched = BorderFactory.createEtchedBorder();
	titled = BorderFactory.createTitledBorder(etched,"M�todos");
	painel1.setBorder(titled);
	GridBagLayout layout = new GridBagLayout();	
	GridBagConstraints configs = new GridBagConstraints();
	painel1.setLayout(layout);	
	configs.fill=GridBagConstraints.NONE;
	configs.anchor=GridBagConstraints.CENTER;
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical	
	for (int i=0;i<opMetodos.length;i++){
	  add(painel1,but[i],configs,0,i,1,1); // ocupa 1 linha da grade
	}
	// Cria um painel para o parametro
	JPanel painel2 =new JPanel();
	titled = BorderFactory.createTitledBorder(etched,"Par�metro");
	painel2.setBorder(titled);
	painel2.setLayout(layout);
	JLabel titPar1=new JLabel("Ordem do sistema=",SwingConstants.RIGHT);
	param1=new JTextField(Integer.toString(ordem),3);
	param1.setBackground(Color.white);
	param1.setAlignmentX(SwingConstants.LEFT);	
	param1.getDocument().addDocumentListener(this);
	configs.fill=GridBagConstraints.NONE;
	configs.anchor=GridBagConstraints.EAST; // alinha a direita
	configs.weightx=100; configs.weighty=100; // nao vai esticar na vertical	
	add(painel2,titPar1,configs,0,0,1,1); // ocupa 1 linha da grade
	configs.anchor=GridBagConstraints.WEST; // alinha a esquerda
	add(painel2,param1,configs,1,0,1,1); // ocupa 1 linha da grade
	
	// cria a area de texto para mensagens
	quadroRes=new JTextArea(5,20);
	quadroRes.setWrapStyleWord(true);
	painelRolagem=new JScrollPane(quadroRes);
	painelRolagem.setAutoscrolls(true);

//	Cria um painel para o titulo deste quadro
	JPanel painelTitulo1=new JPanel();
	titled = BorderFactory.createEtchedBorder();
	painelTitulo1.setBorder(titled);
	JLabel titSaida=new JLabel("MENSAGENS",SwingConstants.CENTER);
	painelTitulo1.add(titSaida);

//	Cria um subpainel para o quadro da saida de mensagens
	JPanel painel3= new JPanel();	
	painel3.setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical
	add(painel3,painelTitulo1,configs,0,0,1,1); // ocupa 1 linha da grade
	configs.weightx=10;configs.weighty=100; // estica tanto na vertical quanto na horizontal
	add(painel3,painelRolagem,configs,0,1,1,2); // ocupa 2 linhas da grade
	
//	Painel que engloba painel 1 a 3
	JPanel painelCentral1 =new JPanel();		
	painelCentral1.setLayout(layout); 
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral1,painel1,configs,0,0,1,4); // ocupa 1 coluna - 4 linhas	
	configs.weightx=100; configs.weighty=100; // vai esticar na horizontal
	add(painelCentral1,painel2,configs,1,0,2,1); // ocupa 2 colunas - 1 linha
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral1,painel3,configs,1,1,2,3); // ocupa 2 colunas - 3 linhas		

//	Cria um painel para os botoes de controle
	JPanel painelBotoes=new JPanel();	
	salvaButton=new JButton("SALVAR DADOS E RESULTADOS");
	salvaButton.addActionListener(this);	
	sairButton=new JButton("Exit");
	sairButton.addActionListener(this);
	painelBotoes.add(salvaButton);
	painelBotoes.add(sairButton);
	JPanel painelAutor=new JPanel();
	painelAutor.setLayout(new BorderLayout());
	JLabel autor=new JLabel("ISANE",SwingConstants.SOUTH_EAST);
	autor.setFont(new Font("TimesRoman",Font.ITALIC,11));	
	painelAutor.add(autor,BorderLayout.EAST);
	JPanel painelControles=new JPanel();
	painelControles.setLayout(new BorderLayout());
	painelControles.add(painelBotoes,BorderLayout.CENTER);
	painelControles.add(painelAutor,BorderLayout.EAST);
	
//	Cria um painel para o titulo de entrada de dados
	JPanel painelTitulo2=new JPanel();
	titled = BorderFactory.createEtchedBorder();
	painelTitulo2.setBorder(titled);
	JLabel titEnt=new JLabel("Stiffness",SwingConstants.CENTER);
	painelTitulo2.add(titEnt);
	
	// Painel para a matriz A
	tabelaModeloA=new MyTableModel(matrizA,ordem,ordem);
	tableA = new JTable(tabelaModeloA);
	int qlar=larguraTotal/2; int qalt=ordem*tableA.getRowHeight();
     tableA.setPreferredScrollableViewportSize(new Dimension(qlar+5, qalt+2));
     tableA.setEnabled(false);
     tableA.getModel().addTableModelListener(this);
     for (int i = 0; i < tableA.getColumnCount(); i++) {
       tableA.getColumnModel().getColumn(i).setMaxWidth(100);
       tableA.getColumnModel().getColumn(i).setMinWidth(30);
     }
     scrollPaneTabelaA = new JScrollPane(tableA);
     painelMA=new JPanel();
	titled = BorderFactory.createTitledBorder(etched,"MATRIZ K");
	painelMA.setBorder(titled);
     painelMA.add(scrollPaneTabelaA);
     
	// Painel para a matriz B
	tabelaModeloB=new MyTableModel(matrizB,1,ordem);
	tableB = new JTable(tabelaModeloB);
	qlar=larguraTotal/6; 
     tableB.setPreferredScrollableViewportSize(new Dimension(qlar, qalt+2));
     tableB.setEnabled(false);
     tableB.getModel().addTableModelListener(this);
     scrollPaneTabelaB = new JScrollPane(tableB);
     painelMB=new JPanel();
	titled = BorderFactory.createTitledBorder(etched,"MATRIZ d");
	painelMB.setBorder(titled);
     painelMB.add(scrollPaneTabelaB);
     
//	Cria um painel para o titulo de saida de resultados
	JPanel painelTitulo3=new JPanel();
	titled = BorderFactory.createEtchedBorder();
	painelTitulo3.setBorder(titled);
	JLabel titSai=new JLabel("Forces",SwingConstants.CENTER);
	painelTitulo3.add(titSai);

	// Painel para a matriz X
	tabelaModeloX=new MyTableModel(matrizX,1,ordem);
	tableX = new JTable(tabelaModeloX);
	qlar=larguraTotal/6; 
     tableX.setPreferredScrollableViewportSize(new Dimension(qlar, qalt+2));
     //tableX.setBackground(Color.LIGHT_GRAY);tableX.repaint();
     //tableX.setBackground(new Color(220,220,220));
     tableX.setEnabled(false);
     scrollPaneTabelaX = new JScrollPane(tableX);
     painelMX=new JPanel();
	titled = BorderFactory.createTitledBorder(etched,"MATRIZ f");
	painelMX.setBorder(titled);
     painelMX.add(scrollPaneTabelaX);     
	
//	Painel que engloba os paines das matrizes
	painelCentral2 =new JPanel();		
	painelCentral2.setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // vai esticar na vertical e horizontal
	add(painelCentral2,painelTitulo2,configs,0,0,3,1); // ocupa 3 colunas - 1 linhas
	add(painelCentral2,painelTitulo3,configs,3,0,1,1); // ocupa 1 colunas - 1 linhas
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral2,painelMA,configs,0,1,2,5); // ocupa 2 colunas - 5 linhas	
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral2,painelMB,configs,2,1,1,5); // ocupa 1 coluna - 5 linhas
	add(painelCentral2,painelMX,configs,3,1,1,5); // ocupa 1 coluna - 5 linhas
		
	// adiciona os paineis titulo, central e botoes ao content atual
	setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical	
	add(this,paineltitulo,configs,0,0,1,1); // ocupa 1 colunas,1 linha da grade
	configs.weightx=100; configs.weighty=100; // vai esticar na horizontal/vertical
	add(this,painelCentral1,configs,0,1,1,4); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=100; // nao vai esticar na vertical
	add(this,painelCentral2,configs,0,5,1,5); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical
	add(this,painelControles,configs,0,10,1,1); // ocupa 1 linhas da grade
	
  }// fim de menuPanel-construtor
  
  public void setParametro(int p){
  	ordem = p;  	
  }
  
  public int getParametro(){
  	return ordem;  	
  }
   
  /** automatiza o posicionamento no layout GridBagLayout
   * @param j container a adicionar o componente
   * @param c componente a adicionar o elemento
   * @param gbc configuracoes do gridbaglayout
   * @param x coluna da grade
   * @param y linha da grade
   * @param w percentagem de esticamento em x
   * @param h percentagem de esticamento em y */
  public void add(Container j, Component c, GridBagConstraints gbc, int x,int y, int w, int h){
    gbc.gridx=x;
    gbc.gridy=y;
    gbc.gridwidth=w;
    gbc.gridheight=h;
    j.add(c,gbc);
  }
  
   /** Metodo para tratamento de valores inseridos em JTextField
   * @param e DocumentEvent capturado   */
  public void insertUpdate (DocumentEvent e) {
    try {
      validaDados(); 
    }
    catch (Exception ex){
    quadroRes.setText(ex.getMessage());
    }
  }
  /** Metodo para tratamento de valores removidos em JTextField
   * @param e DocumentEvent capturado   */
  public void removeUpdate (DocumentEvent e) {validaDados(); }
  /** Metodo para tratamento de valores alterados em JTextField
   * @param e DocumentEvent capturado   */
  public void changedUpdate (DocumentEvent e) {validaDados(); }
  
  /** Metodo para validacao e conversao dos campos tipo texto 
   * dos parametros digitados pelo usuario */
  public void validaDados()
  {
    // obtem as strings de todos os textos digitados
    String dadon=param1.getText();
    dadon=dadon.trim();
    if (dadon.equals("")) dadon="0";    
    // verifica os dados e guarda os valores convertidos em 
    // numeros no objeto par.    
    if (ValidacaoDados.eIntPosNN(dadon))
    { 
      quadroRes.setText("Dados corretos\n"+param1.getText());
      Integer n=new Integer(dadon);
      this.ordem=n.intValue();
      this.matrizA=inicializaMatriz(0);
      this.tabelaModeloA=inicializaTabelaModelo(this.matrizA,ordem,ordem); 
      tableA.setModel(tabelaModeloA); tableA.repaint();
      tableA.getModel().addTableModelListener(this);
      this.matrizB=inicializaVetor(0);
      this.tabelaModeloB=inicializaTabelaModelo(this.matrizB,1,ordem); 
      tableB.setModel(tabelaModeloB); tableB.repaint();
      tableB.getModel().addTableModelListener(this);
      this.matrizX=inicializaVetor(0);
      this.tabelaModeloX=inicializaTabelaModelo(this.matrizX,1,ordem); 
      tableX.setModel(tabelaModeloX); tableX.repaint();
       //verifica se a largura da tabela ultrapassa limite do painel
      // se auto_resize estiver ligado, as colunas se ajustam para caber, mas 
      // a partir de um certo ponto atrapalha tudo
          
      redimensionaSP();      
    }
    else quadroRes.setText("Dados incorretos\n"+param1.getText());
  }
  	
	/** executa o m�todo escolhido
	 * @param evt  objeto com o evento escolhido 	 */
	public void actionPerformed(ActionEvent evt) 
	{
	  //String s =evt.getActionCommand();
	  Object source = evt.getSource();
	  //String comando = group.getSelection().getActionCommand();
	  if (source==but[0]) 
	  {	
	  	metodoAtual=opMetodos[0];//Gauss
	  	calcula();
	  	quadroRes.setText(metodoAtual);	  	
	  }
	  else if (source==but[1]) 
	    {metodoAtual=opMetodos[1];// gauss escalonado
	  	calcula();
	  	quadroRes.setText(metodoAtual);
	    //quadroRes.setText("Metodo escolhido: "+metodoAtual+" n�o implementado!");
	    }
	  else if (source==but[2]) 
	    {metodoAtual=opMetodos[2];// Invers�o de A
	  	calcula();
	  	quadroRes.setText(metodoAtual);	    
	    }
	  else if (source==salvaButton)
	  {
	    String cabecalho="UFMG-MESTRADO-M�TODOS N�MERICOS";
	    cabecalho+="\n\nAluna: LUCIANA CAMARA";
	    Date hoje= new Date();
	    DateFormat data = DateFormat.getDateInstance();
	    cabecalho+="\n\nData: "+data.format(hoje);
	    cabecalho+="\n\nTP10 E TP11 - "+titulo.getText()+"\n\n";	    
	    IntArquivo.salvaResultados(cabecalho+relatorioProcessamento());
	  }
	  else if (source==sairButton)
	  {
	  	this.setVisible(false);
	  	//this.setVisible(false);
	  }
	  repaint();	
	}// fim de actionPerformed
	
	/** @return uma string com todo o processamento formatado! */
	public String relatorioProcessamento(){
	  String txt=""; 
	  DecimalFormat f2 = new DecimalFormat("00");
	  //	 numero normalizado ocupa 8 caracteres (com 3 casas) +1 espa�o=9
	  txt+="    MATRIZ A"+espacos(ordem*9-8+7)+"MATRIZ B\n"; 
	  txt+="L/C ";for (int i=0;i<ordem;i++)txt+="C"+f2.format(i+1)+espacos(9-3);
	  txt+=espacos(8)+"C01\n";
	  for (int i=0;i<ordem;i++){
	    txt+="L"+f2.format(i+1)+" ";
	    for (int j=0;j<ordem;j++) txt+=NotacaoCientifica.norma(((Double)matrizA[i][j]).doubleValue(),3)+" ";
	    txt+="   L"+f2.format(i+1)+" "+NotacaoCientifica.norma(((Double)matrizB[i][0]).doubleValue(),3)+"\n";
	  }
	  txt+="\nM�TODO DE RESOLU��O= "+metodoAtual.toUpperCase()+"\n";
	  txt+="RESULTADO:\n";
	  txt+="    MATRIZ X:\n";
	  for (int i=0;i<ordem;i++){
	    txt+="L"+f2.format(i+1)+" "+NotacaoCientifica.norma(((Double)matrizX[i][0]).doubleValue(),5)+"\n";
	  }
	  return txt;
	}
	
	/** @param n numero de espa�os 
	* @return  uma string com n espacos */
	public String espacos(int n){
	  if (n<2)n=2;
	  String esp="";
	  for (int i=0;i<n;i++) esp+=" ";
	  return esp;
	}

  	/* (non-Javadoc)
  	 * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
  	 */
  	public void tableChanged(TableModelEvent e) {
	    int row = e.getFirstRow();
	    int column = e.getColumn();
	    MyTableModel model = (MyTableModel)e.getSource();	    
	    Object data = model.getValueAt(row, column);
	    if (model==tabelaModeloA)matrizA[row][column-1]=(Double)data;	      
	    if (model==tabelaModeloB)matrizB[row][column-1]=(Double)data;	      
	    //quadroRes.setText(txt);
	    calcula();
	  }
	
	/** Calcula e apresenta os resultados 
	 * @return uma string com todo o calculo e resultados */
	public void calcula(){
	  try {
	    double[][]matA=new double[ordem][ordem];
	    //matriz do tipo double
	    // converte as matrizes Double para double
	    for (int i=0;i<ordem;i++){
	      for (int j=0;j<ordem;j++)matA[i][j]=((Double)matrizA[i][j]).doubleValue();
	    }
	    double[]matB=new double[ordem];
	    for (int i=0;i<ordem;i++)matB[i]=((Double)matrizB[i][0]).doubleValue();
	    // matriz resultado
	    double[]matX=new double[ordem];
	    //resolve de acordo com o metodo escolhido
	    if (metodoAtual.equals(opMetodos[0])) // Gauss
	      matX=Megauss.solveMegauss(matA,matB);
	    else if (metodoAtual.equals(opMetodos[1])) // gauss escalonado
	      matX=GaussEscalonado.solveGaussEscalonado(matA,matB);
	    else if (metodoAtual.equals(opMetodos[2])) // inversao de A
	    {	      	
	      // monta matB2 de 2 dimensoes para poder multiplicar por A^-1
	      double [][]matB2=new double[ordem][1];
	      for (int i=0;i<ordem;i++) matB2[i][0]=matB[i];
	      double [][]matX2=new double[ordem][1];
	      matX2=Matriz.multiplica(Matriz.inversa(matA),matB2);
	      // copia os valores para matX
	      for (int i=0;i<ordem;i++) matX[i]=matX2[i][0];
	    }
//	  copia os resultados ao componente tableX
	      for (int i=0;i<ordem;i++){
	        matrizX[i][0]=new Double(matX[i]);
	        tableX.setValueAt(matrizX[i][0],i,1);
	      }
	  }
	 catch (Exception e)	{
	   quadroRes.setText("ERRO! \n"+e.getMessage());	    
	 }
	}//fim de calcula
	
/** metodo para reinicializar uma matriz de objects 
 * @param va valor com o qual a matriz sera inicializado
* @return um matriz de ordemxordem reinicializada */
public Object[][] inicializaMatriz(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][ordem];
  for (int i=0;i<ordem;i++){
    for (int j=0;j<ordem;j++)mat[i][j]=(Object)valor;
  }
  return mat;  
}

/** metodo para reinicializar um vetor 
 * @param va valor com o qual o vetor sera inicializado
* @return um matriz de 1 coluna reinicializada */
public Object[][] inicializaVetor(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][1];
  for (int i=0;i<ordem;i++){
    mat[i][0]=(Object)valor;
  }
  return mat;  
}

/** Metodo para reinicializar o modelo de tabela 
 * @param mat nova matriz de objetos
* @param nc numero de colunas
* @param nl numero de linhas
* @return um novo modelo de tabela */
public MyTableModel inicializaTabelaModelo(Object[][]mat,int nc,int nl){
  MyTableModel tabModel=new MyTableModel(mat,nc,nl);
  return tabModel;
}

/** Metodo para redimensionar os scrollpanes de acordo como novos limites */
public void redimensionaSP(){
  int qlar=(int)(painelMA.getWidth()*0.9);  
  int qalt=ordem*tableA.getRowHeight(); 
  if (ordem>((int)(0.9*painelMA.getWidth()/30)-2)){
    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    for (int i = 0; i < tableA.getColumnCount(); i++) {
      tableA.getColumnModel().getColumn(i).setMaxWidth(40);
      tableA.getColumnModel().getColumn(i).setMinWidth(30);
    }
    qalt+=scrollPaneTabelaA.getHorizontalScrollBar().getHeight();
  }
  else {
    tableA.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    for (int i = 0; i < tableA.getColumnCount(); i++) {
      tableA.getColumnModel().getColumn(i).setMaxWidth(1000);
      tableA.getColumnModel().getColumn(i).setMinWidth(30);
      tableA.getColumnModel().getColumn(i).setPreferredWidth(75);
    }
  }
  // verifica se a altura nao ultrapassou o limite do painel   
  int limAltura=(int)(0.8*painelMA.getHeight());
  qalt+=tableA.getRowHeight()+5;
  if (qalt>limAltura) qalt=limAltura;  
  int qlarsp=(int)(0.9*qlar);
  tableA.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));  
  tableA.revalidate(); tableA.repaint();
  scrollPaneTabelaA.setSize(new Dimension(qlarsp,qalt));
  scrollPaneTabelaA.revalidate(); scrollPaneTabelaA.repaint();
  
  //  redefine matrizB  
  qlarsp=scrollPaneTabelaB.getWidth();
  tableB.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));     
  tableB.repaint(); tableB.revalidate();  
  scrollPaneTabelaB.setSize(new Dimension(qlarsp,qalt));
  scrollPaneTabelaB.revalidate(); scrollPaneTabelaB.repaint();
  
  //  redefine matrizX
  qlarsp=scrollPaneTabelaX.getWidth();  
  tableX.setPreferredScrollableViewportSize(new Dimension(qlarsp, qalt));     
  tableX.repaint(); tableX.revalidate();
  scrollPaneTabelaX.setSize(new Dimension(qlarsp,qalt));
  scrollPaneTabelaX.revalidate(); scrollPaneTabelaX.repaint();
  
}
  
}// fim de MenuPanel

/** Classe para a criacao e posicionamento do Frame principal 
 * do aplicativo
 * 
 * @author Camara, Luciana
 * @since 08/05/05 
 * @version 1.0 */

/*
public class JanelaTPGUI extends JFrame 
{		
	/** Construtor da JanelaTPGUI 
	 * @param opMetodos lista de metodos a serem exibidos (de qualquer tamanho)
	 */
	/*public JanelaTPGUI(String[] opMetodos) 
	{ setTitle("INSANE");
		//	 Pega as configuracoes do usuario
	Toolkit tk=Toolkit.getDefaultToolkit();
	Dimension d = tk.getScreenSize();
	int screenHeight=d.height;
	int screenWidth=d.width;
	int frameWidth=(int)8*screenWidth/10;
	int frameHeight=(int)8*screenHeight/10;
	setSize(frameWidth,frameHeight); 
	addWindowListener(new WindowAdapter()
	    { public void windowClosing(WindowEvent e)
	    { System.exit(0);
	    }
	    } );		
	// posiciona o frame no meio da tela
	setLocation(screenWidth/8,screenHeight/10);
	//Atribui um icone ao frame
	Image icone =tk.getImage("icone.jpg");
	setIconImage(icone);
	//		Cria o container e atribui o layout de GridBag
	Container contentPane=getContentPane();
	
	MenuPanel mp = new MenuPanel(frameWidth,frameHeight,opMetodos);
	
	contentPane.add(mp);
	
	}
}//fim de JanelaTPGUI8*/

